﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Data;

using BMG.BLL.Classes;

namespace BMG.BackOffice.UserControls
{
    /// <summary>
    /// Logique d'interaction pour UserControl1.xaml
    /// </summary>
    public partial class ProduitsManager : UserControl
    {
        const string DefaultText = "Intitulé ou descrition du produit";
        public ProduitsManager()
        {
            InitializeComponent();
            PopulateAndBind();
            cbbCatSchearch.SelectedIndex = 0;
            cbbCat.SelectedIndex = 0;
            btnValiderModif.IsEnabled = false;
            btnSupprimer.IsEnabled = false;            
        }

        public void PopulateAndBind()
        {
            DataTable dt = PRODUIT_MANAGER.GetList(false);
            listViewListeProduits.ItemsSource = dt.DefaultView;
            listViewListeProduits.SelectedValuePath = "id_pro";

            DataTable dtCatWithNull = CATEGORIE_MANAGER.GetList(true);
            cbbCatSchearch.ItemsSource = dtCatWithNull.DefaultView;

            DataTable dtCat = CATEGORIE_MANAGER.GetList(false);
            cbbCat.ItemsSource = dtCat.DefaultView;

            tbxDescriptionSearch.Text = DefaultText;
            if (listViewListeProduits.SelectedItems.Count != 1)
            {
                btnValiderModif.IsEnabled = false;
                btnSupprimer.IsEnabled = false;
            }

            listViewHistorique.ItemsSource = PRODUIT_MANAGER.GetHistorique(null, DateTime.Today, DateTime.Now.AddHours(1)).DefaultView;
        }

        /// <summary>
        /// Evenement appelé par le clic du bouton de recherche
        /// </summary>
        /// <param name="sender">Objet déclencheur de l'événement</param>
        /// <param name="e">Paramètres de l'événement</param>
        private void btnSearch_Click(object sender, RoutedEventArgs e)
        {                        
            int? id_cat = (cbbCatSchearch.SelectedValue == null) ? (int?)null : Int32.Parse(this.cbbCatSchearch.SelectedValue.ToString());
            string Description = tbxDescriptionSearch.Text == DefaultText ? "" : tbxDescriptionSearch.Text;
            this.listViewListeProduits.ItemsSource = PRODUIT_MANAGER.GetList(Description, id_cat).DefaultView;
        }

        /// <summary>
        /// Evenement appelé lorsque le textbox de recherche par description recoit le focus, permet de selectionner le texte a l'interieur
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Paramètres de l'événement</param>
        private void tbxDescriptionSearch_GotFocus(object sender, MouseButtonEventArgs e)
        {
            if (!tbxDescriptionSearch.IsKeyboardFocusWithin)
            {
                tbxDescriptionSearch.Focus();
                e.Handled = true;
            }
        }

        /// <summary>
        /// Méthode qui sélectionne le texte du controle textbox de la recherche par description
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Parametres de l'evenement</param>
        private void SelectAllText(object sender, EventArgs e)
        {
            tbxDescriptionSearch.SelectAll();
        }

        /// <summary>
        /// Evenement lancé par la pression d'une touche dans le textBox de recherche par desciption, permet de valider la recherche par appui de la touche
        /// entrée
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Paramètres de l'événement</param>
        private void tbxDescriptionSearch_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Return)
            {
                this.btnSearch_Click(tbxDescriptionSearch, e);
            }
        }

        /// <summary>
        /// Evenement appelé par le clic sur le bouton dajout d'un nouveau produit
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Paramètre de l'événement</param>
        private void btnAddProduit_Click(object sender, RoutedEventArgs e)
        {
            string aIntitule = tbxNom.Text;
            string aDescription = tbxDescription.Text;
            int? aID_CAT = cbbCat.SelectedValue == null ? (int?)null : Int32.Parse(cbbCat.SelectedValue.ToString());
            decimal aPrix;
            string Prix = tbxPrix.Text.Replace('.', ',');
            Decimal.TryParse(Prix, out aPrix);
            int aStock;
            int.TryParse(tbxStock.Text, out aStock);
            if (String.IsNullOrEmpty(aIntitule) || String.IsNullOrEmpty(aDescription) || aID_CAT== null)
            {
                MessageBox.Show("Les champs de description, de nom de produit et de catégorie sont obligatoires");
            }
            else
            {
                if (PRODUIT_MANAGER.Insert(aIntitule, aDescription, aPrix, aStock, (int)aID_CAT) < 0)
                {
                    MessageBox.Show("Une erreur s'est produite lors de l'insertion");
                }
                PopulateAndBind();
            }
        }

        /// <summary>
        /// Evénement lancé par le clic sur bouton de validation des modifications
        /// </summary>
        /// <param name="sender">Objet qui déclenche l'événement</param>
        /// <param name="e">Parametres de l'événement</param>
        private void btnValiderModif_Click(object sender, EventArgs e)
        {            
            string aIntitule = tbxNom.Text;
            string aDescription = tbxDescription.Text;
            int aID_CAT = Int32.Parse(cbbCat.SelectedValue.ToString());
            decimal aPrix;
            string Prix = tbxPrix.Text.Replace('.', ',');
            Decimal.TryParse(Prix, out aPrix);
            int aStock;
            int.TryParse(tbxStock.Text, out aStock);

            if (listViewListeProduits.SelectedItems.Count > 1)
            {
                List<int> liste = new List<int>();
                foreach (DataRowView item in listViewListeProduits.SelectedItems)
                {
                    liste.Add(int.Parse(item["id_pro"].ToString()));
                }
                if (PRODUIT_MANAGER.Update(liste,aID_CAT) > 0)
                {
                    MessageBox.Show("Transfert des produits effectué");
                }
                else
                {
                    MessageBox.Show("Le transfert n'a pas été effectué ou seulement partiellement");
                }
            }
            else
            {
                int Id_Produit = Int32.Parse(listViewListeProduits.SelectedValue.ToString());
                if (PRODUIT_MANAGER.Update(Id_Produit, aIntitule, aDescription, aPrix, aStock, aID_CAT) < 0)
                {
                    MessageBox.Show("Une erreur s'est produite lors de la mise à jour du produit");
                }
            }                        
            //Rafraichissement de la liste, permet de garder une cohérence avec la Structure de persistance si multi user
            PopulateAndBind();

        }

        /// <summary>
        ///  Evénement lancé par la sélection d'un élément dans la listView principale
        /// </summary>
        /// <param name="sender">Controle qui déclenche l'événement</param>
        /// <param name="e">Parametre de l'événement</param>
        private void listViewList_selectChanged(object sender, EventArgs e)
        {
            btnValiderModif.IsEnabled = true;
            btnSupprimer.IsEnabled = true;
            if (listViewListeProduits.SelectedItems.Count > 1)
            {
                btnAddProduit.IsEnabled = false;
                btnSupprimer.IsEnabled = false;
                tbxDescription.IsEnabled = false;
                tbxNom.IsEnabled = false;
                tbxStock.IsEnabled = false;
                tbxPrix.IsEnabled = false;
            }
            else
            {
                btnAddProduit.IsEnabled = true;
                btnSupprimer.IsEnabled = true;
                tbxDescription.IsEnabled = true;
                tbxNom.IsEnabled = true;
                tbxStock.IsEnabled = true;
                tbxPrix.IsEnabled = true;
            }
        }

        /// <summary>
        ///  Evénement lancé par la suppression d'un élément dans la listView principale
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSupprimer_Click(object sender, RoutedEventArgs e)
        {
            int Id_produit = Int32.Parse(listViewListeProduits.SelectedValue.ToString());

            if (PRODUIT_MANAGER.Delete(Id_produit)<0)
            {
                MessageBox.Show("Une erreur est survenue lors de la suppression du produit");
            }
            else
            {
                MessageBox.Show("Suppression du produit effectuée");
            }
            PopulateAndBind();

        }

        /// <summary>
        /// Méthode qui est déclenchée à la frappe d'un caractère dans le tbx de prix
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void tbxPrix_KeyUp(object sender, KeyEventArgs e)
        {
            foreach (Char item in tbxPrix.Text)
            {
                if ( (item == ',' || item == '.' || !Char.IsDigit(item)) && (tbxPrix.Text.Length > 0) )
                {
                    if (item == ',')
                    {
                        tbxPrix.Text = tbxPrix.Text.Replace(item, '.');
                    }
                    else if (item != '.')
                    {
                        tbxPrix.Text = tbxPrix.Text.Remove(tbxPrix.Text.Length - 1);
                    }                    
                }
                
            }
            tbxPrix.Select(tbxPrix.Text.Length, 0);
             
        }

        private void tbxStock_KeyUp(object sender, KeyEventArgs e)
        {
            foreach (Char item in tbxStock.Text)
            {
                if (!Char.IsNumber(item) && tbxStock.Text.Length > 0)
                {
                    tbxStock.Text = tbxStock.Text.Remove(tbxStock.Text.Length - 1);
                }               
            }
            tbxStock.Select(tbxStock.Text.Length, 0);
        }

    }
}
